// This file is part of OpenMeca, an easy software to do mechanical simulation.
//
// Author(s)    :  - Damien ANDRE  <openmeca@gmail.com>
//
// Copyright (C) 2012 Damien ANDRE
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.


#ifndef OpenMeca_Core_SystemSettings_hpp
#define OpenMeca_Core_SystemSettings_hpp

#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>

#include "OpenMeca/Core/SetOf.hpp"
#include "OpenMeca/Gui/WidgetSystemSettings.hpp"
#include "OpenMeca/Core/AutoRegister.hpp"

namespace OpenMeca
{
  namespace Core
  {


    class SystemSettings : public AutoRegister<SystemSettings>
    {

    public:    
      SystemSettings();
      ~SystemSettings();

      void AddWidget(Gui::WidgetSystemSettings&);
      void RemoveWidget(Gui::WidgetSystemSettings&);

      double& GetScalePart();
      const double& GetScalePart() const;

      void Update();

    private:
      SystemSettings(const SystemSettings&);            //Not Allowed    
      SystemSettings& operator=(const SystemSettings&); //Not Allowed

      friend class boost::serialization::access;
      template<class Archive>
      void serialize(Archive & ar, const unsigned int);
      
     


    private:
      SetOf<Gui::WidgetSystemSettings> widgets_;
      double scalePart_;
    };

    template<class Archive>
    inline void
    SystemSettings::serialize(Archive & ar, const unsigned int)
    {
      ar & BOOST_SERIALIZATION_NVP(scalePart_);
    }


  }
}
 
#endif
